const log4js = require('log4js');
const logFormat = require('./logFormat')
//pm2 写入失败问题：https://cyyjs.github.io/2017/11/15/I4m5wYG9ovY6L9Va/
log4js.configure({
    appenders: {
        logFile: {   //文件形式打印日志
            type: "dateFile",
            filename: './logs/log',//写入日志文件的路径
            alwaysIncludePattern: true,//（默认为false） - 将模式包含在当前日志文件的名称以及备份中
            //compress: true,//（默认为false） - 在滚动期间压缩备份文件（备份文件将具有.gz扩展名）
            pattern: "-yyyy-MM-dd.log",//（可选，默认为.yyyy-MM-dd） - 用于确定何时滚动日志的模式。格式:.yyyy-MM-dd-hh:mm:ss.log
            encoding: 'utf-8',//default "utf-8"，文件的编码
            maxLogSize: 1024 * 1024, //文件最大存储空间，当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件
            backups: 3,
        },
        errorFile: {   //文件形式打印日志
            type: "dateFile",
            filename: './logs/error',//写入日志文件的路径
            alwaysIncludePattern: true,//（默认为false） - 将模式包含在当前日志文件的名称以及备份中
            //compress: true,//（默认为false） - 在滚动期间压缩备份文件（备份文件将具有.gz扩展名）
            pattern: "-yyyy-MM-dd.log",//（可选，默认为.yyyy-MM-dd） - 用于确定何时滚动日志的模式。格式:.yyyy-MM-dd-hh:mm:ss.log
            encoding: 'utf-8',//default "utf-8"，文件的编码
            maxLogSize: 1024 * 1024, //文件最大存储空间，当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件
            backups: 3,
        },
        netFile: {   //文件形式打印日志
            type: "dateFile",
            filename: './logs/net',//写入日志文件的路径
            alwaysIncludePattern: true,//（默认为false） - 将模式包含在当前日志文件的名称以及备份中
            //compress: true,//（默认为false） - 在滚动期间压缩备份文件（备份文件将具有.gz扩展名）
            pattern: "-yyyy-MM-dd.log",//（可选，默认为.yyyy-MM-dd） - 用于确定何时滚动日志的模式。格式:.yyyy-MM-dd-hh:mm:ss.log
            encoding: 'utf-8',//default "utf-8"，文件的编码
            maxLogSize: 1024 * 1024, //文件最大存储空间，当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件
            backups: 3,
        },
        console: {   //控制台打印日志
            type: 'console'
        }
    },
    categories: {
        logFile: {
            appenders: ['logFile'],
            level: log4js.levels.ALL
        },
        errorFile: {
            appenders: ['errorFile'],
            level: log4js.levels.ERROR
        },
        netFile: {
            appenders: ['netFile'],
            level: log4js.levels.ALL
        },
        console: {   //默认使用打印日志的方式
            appenders: ['console'],  // 指定为上面定义的appender，如果不指定，无法写入
            level: log4js.levels.ALL             //打印日志的级别
        },
        default: {   //默认使用打印日志的方式
            appenders: ['logFile'],  // 指定为上面定义的appender，如果不指定，无法写入
            level: log4js.levels.ALL             //打印日志的级别
        },
    },
    pm2: false//（布尔值）（可选） -如果你使用的是运行你的应用程序此设置为true PM2，否则日志将无法正常工作（你还需要安装PM2对讲为PM2模块：pm2 install pm2-intercom）
});

class Log4Util {
    constructor(isDevelopment) {
        //开发模式，全部打印到控制台
        if (isDevelopment) {
            let log = log4js.getLogger("console");
            this.logFile = log;
            this.errorFile = log;
            this.netFile = log;
        } else {
            this.logFile = log4js.getLogger('logFile'); //log打印
            this.errorFile = log4js.getLogger('errorFile');//发生错误时候打印
            this.netFile = log4js.getLogger('netFile');//网络请求的时候打印
        }
        this.netLog = this.netLog.bind(this);
    }

    /**
     * 网络请求的时候打印
     * @param req
     * @param res
     * @param next
     */
    netLog(req, res, next) {
        let reqStr = JSON.stringify(logFormat.formatReqLog(req));
        this.netFile.info(reqStr)
        next();
    }

    /**
     * 发生错误时候打印
     * @param err
     * @param req
     * @param res
     */
    errorLog(err, req, res) {
        let errStr = JSON.stringify(logFormat.formatErrorLog(err, req, res));
        this.errorFile.error(errStr)
    }

    /**
     * 自定义打印记录
     * @param type
     * @param info
     */
    log(type, info) {
        this.logFile[type](info);
    }
}


const node_env = process.env.NODE_ENV;
module.exports = new Log4Util(node_env === "development");

